import time
# 设计装饰器， 以一个函数作为参数，并返回一个函数
def metric(fn):
    # 对程序进行封装
    def wrapper(*args,**kw):
        # 在程序执行之前记录一次时间
        start_time = time.time()
        # 需要执行一次程序
        fn(*args,**kw)
        # 在程序执行之后记录一次时间
        end_time = time.time()
        # 两次时间相见，得到的差就是程序执行时间
        print('耗时：{:.4f}s'.format(end_time - start_time))
    return wrapper
# 装饰器调用方式
@metric
# 拿上周乘法表作为测试函数
def fn_runtime():
    '''
            9x9乘法表的八种写法
    '''
    print('=' * 30, '第一种(采用for循环)', '=' * 30)
    # 有九行，从1-9，row代表行
    for row in range(1, 10):
        # 也有九列，但是每一列不大于行，即第几行最多几列
        for col in range(1, row + 1):
            # 每一项输出row*col=他们的值，注意要用到占位符保证对其，每一项之间用空格，每一行之间用换行
            print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
        print('')
    print('=' * 30, '第二种(采用for循环)', '=' * 30)
    # 第二种每一行的列数与第一相反，第一行有9列，最后一行为1列，
    for row in range(9, 0, -1):
        for col in range(1, row + 1):
            print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
        print('')
    print('=' * 30, '第三种(采用for循环)', '=' * 30)
    # 第三种和第一种逻辑差不多，只不过前面用空位跳过站位
    for row in range(1, 10):
        for col in range(9, 0, -1):
            if col > row:
                print(' ' * 8, end=' ')
            else:
                print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
        print('')
    print('=' * 30, '第四种(采用for循环)', '=' * 30)
    # 第四种和第二种逻辑差不多，与第三种一样站位
    for row in range(9, 0, -1):
        for col in range(9, 0, -1):
            if col > row:
                print(' ' * 8, end=' ')
            else:
                print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
        print('')
    print('=' * 30, '第五种(采用while循环)', '=' * 28)
    # while更循环只需要更改for循环内容即可，逻辑差不多
    row = 1
    while row < 10:
        col = 1
        while col < row + 1:
            print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
            col += 1
        print('')
        row += 1
    print('=' * 30, '第六种(采用while循环)', '=' * 28)
    row = 9
    while row > 0:
        col = 1
        while col < row:
            print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
            col += 1
        print('')
        row -= 1
    print('=' * 30, '第七种(采用while循环)', '=' * 28)
    row = 1
    while row < 10:
        col = 9
        while col > 0:
            if col > row:
                print(' ' * 8, end=' ')
            else:
                print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
            col -= 1
        print('')
        row += 1
    print('=' * 30, '第八种(采用while循环)', '=' * 28)
    row = 9
    while row > 0:
        col = 9
        while col > 0:
            if col > row:
                print(' ' * 8, end=' ')
            else:
                print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
            col -= 1
        print('')
        row -= 1
# 测试
if __name__ == '__main__':
    fn_runtime()